package de.pdbm.swt.aufgabe4;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.transform.Templates;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.XMLOutputter;

public class XmlIoImpl implements XmlIo {
	
	private List<Mitarbeiter> mitarbeiterliste = new ArrayList<Mitarbeiter>();
	private List<Produkt> produktliste = new ArrayList<Produkt>();

	@Override
	public void writeMitarbeiter(List<Mitarbeiter> mitarbeiter, OutputStream out)
			throws IOException {
		
		Mitarbeiter mitTemp;
		Element root = new Element("mitarbeiter-list");
		Document doc = new Document(root);
		int index = 0;
		while(!mitarbeiter.isEmpty()) {
			mitTemp = mitarbeiter.remove(0);
			DateFormat formatDat = DateFormat.getDateInstance(DateFormat.MEDIUM);
			String gebDatum = formatDat.format(mitTemp.getGeburtsdatum());
			root.addContent(new Element("mitarbeiter")
			.addContent(new Element("id").addContent(mitTemp.getId()))
			.addContent(new Element("vorname").addContent(mitTemp.getVorname()))
			.addContent(new Element("nachname").addContent(mitTemp.getNachname()))
			.addContent(new Element("geburtsdatum").addContent(gebDatum))
			.addContent(new Element("vbart").addContent(mitTemp.getVbArt().toString())));
			
			if(mitTemp.getChef() != null) {
				root.getChildren().get(index).addContent(new Element("chef").addContent(mitTemp.getChef().getId()));
			}
			index++;
		}
		
		XMLOutputter xmloutput = new XMLOutputter();
		xmloutput.output(doc, out);
		
	}

	@Override
	public void writeProdukte(List<Produkt> produkt, OutputStream out)
			throws IOException {
		Produkt prodTemp;
		Element root = new Element("produkt-list");
		Document doc = new Document(root);
		while(!produkt.isEmpty()) {
			prodTemp = produkt.remove(0);
			root.addContent(new Element("produkt")
			.addContent(new Element("id").addContent(prodTemp.getId()))
			.addContent(new Element("bezeichnung").addContent(prodTemp.getBezeichnung()))
			.addContent(new Element("preis").addContent(prodTemp.getPreis().toString())));
		}
		
		XMLOutputter xmloutput = new XMLOutputter();
		xmloutput.output(doc, out);
		
	}

	@Override
	public List<Mitarbeiter> readMitarbeiter(InputStream in) throws Exception {
		
		 Document doc = null;
		 SAXBuilder builder = new SAXBuilder(); 
         doc = builder.build(in); 
        
         Mitarbeiter entity;
         Element element = doc.getRootElement(); 
         
         List<Element> kindliste = element.getChildren();
         
         while (!kindliste.isEmpty()) {
        	 entity = new MitarbeiterGS();
        	 Element temp = kindliste.remove(0);
        	 entity.setId(temp.getChild("id").getValue());
        	 entity.setVorname(temp.getChild("vorname").getValue());
        	 entity.setNachname(temp.getChild("nachname").getValue());
        	 
        	 String datum = temp.getChild("geburtsdatum").getValue();
        	 entity.setGeburtsdatum(DateFormat.getDateInstance().parse(datum));
        	
        	 VbArt art = VbArt.valueOf(temp.getChild("vbart").getValue());
        	 entity.setVbArt(art);
        	 
        	 if(temp.getChild("chef") != null) {
        		 Mitarbeiter mitTemp = sucheMitarbeiter(temp.getChild("chef").getValue(), mitarbeiterliste);
        		 entity.setChef(mitTemp);
        	 }
        	
        	 mitarbeiterliste.add(entity);
         }
        
         
              
		return mitarbeiterliste;
	}
	
	private Mitarbeiter sucheMitarbeiter(String id,
			List<Mitarbeiter> mitarbeiterliste) {
		Mitarbeiter tempMit = null;
		
		for(int i = 0; i < mitarbeiterliste.size(); i++) {
			if (mitarbeiterliste.get(i).getId().contains(id)) {
				tempMit = mitarbeiterliste.get(i);
			}
		}
		
		return tempMit;
	}

	@Override
	public List<Produkt> readProdukte(InputStream in) throws Exception {
		
		Document doc = null;
		SAXBuilder builder = new SAXBuilder(); 
        doc = builder.build(in); 
       
        Produkt entity;
        Element element = doc.getRootElement(); 
        
        List<Element> kindliste = element.getChildren();
        
        while (!kindliste.isEmpty()) {
       	 entity = new ProduktGS();
       	 Element temp = kindliste.remove(0);
       	 entity.setId(temp.getChild("id").getValue());
       	 entity.setBezeichnung(temp.getChild("bezeichnung").getValue());
       	 entity.setPreis(new BigDecimal(temp.getChild("preis").getValue()));
       	 
       	 produktliste.add(entity);
        }
       
        
             
		return produktliste;
	}

}
